/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dao.concreto;

import bean.Cita;
import bean.ConsultaCita;
import interfaces.IDAOCita;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.management.InstanceNotFoundException;
import javax.sql.rowset.CachedRowSet;

/**
 *
 * @author Ovidio Alonso Zapata
 */
public class DaoCita implements IDAOCita {

    protected ResourceBundle rb;

    public DaoCita() {
        rb = ResourceBundle.getBundle("sql.sqlCita");
    }

    public static boolean existe(CachedRowSet CitaApp, Cita oCita) throws SQLException {
        CitaApp.setObject(1, oCita.getPaciente().toString());
        CitaApp.setObject(2, oCita.getEvaluacion().toString());
        CitaApp.execute();
        CitaApp.beforeFirst();
        if (CitaApp.next()) {
            return true;
        } else {
            return false;
        }

    }

    public ArrayList findByPacientesDia(Connection conn, Date fecha, String turno, String pull, String especialista) throws InstanceNotFoundException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            int i = 0;
            ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_PACIENTES_DIA"));
            ps.setDate(++i, fecha);
//            ps.setString(++i, turno);
//            ps.setString(++i, pull);
            ps.setString(++i, especialista);
/*            ps.setDate(++i, fecha);
            ps.setString(++i, turno);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
 */
            rs = ps.executeQuery();
            ArrayList retorno = new ArrayList();
            while (rs.next()) {
                retorno.add(crearObjeto(rs));
            }
            return retorno;

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    /**
     * Busca pacientes del día teniendo en cuenta la especialidad
     * @param conn
     * @param fecha
     * @param turno
     * @param pull
     * @param especialista
     * @param especialidad describe el nombre de la especialidad en las pruebas fisicas estas pueden ser: saltabilidad,fuerza o velocidad
     * @return
     * @throws InstanceNotFoundException
     */
    public ArrayList findByPacientesDia(Connection conn, Date fecha, String turno, String pull, String especialista, String especialidad) throws InstanceNotFoundException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            int i = 0;
            if (especialidad.equalsIgnoreCase("Fuerza")) {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_PACIENTES_DIA_FUERZA"));
            } else if (especialidad.equalsIgnoreCase("Saltabilidad")) {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_PACIENTES_DIA_SALTABILIDAD"));
            } else {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_PACIENTES_DIA_VELOCIDAD"));
            }

            ps.setDate(++i, fecha);
//            ps.setString(++i, turno);
//            ps.setString(++i, pull);
            ps.setString(++i, especialista);
//            ps.setDate(++i, fecha);
//            ps.setString(++i, turno);
//            ps.setString(++i, pull);
//            ps.setString(++i, especialista);
            rs = ps.executeQuery();
            ArrayList retorno = new ArrayList();
            while (rs.next()) {
                retorno.add(crearObjetoPruebasFisicas(rs));
            }
            return retorno;

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    private ConsultaCita crearObjeto(ResultSet rs) throws SQLException {
        ConsultaCita oConsultaCita = new ConsultaCita();
        oConsultaCita.setIdUsuario(rs.getString("idusuario"));
        oConsultaCita.setApellido(rs.getString("apellido"));
        oConsultaCita.setEvaluacion(rs.getString("evaluacion"));
        oConsultaCita.setFecha(rs.getDate("fecha_nacimiento"));
        oConsultaCita.setInstitucion(rs.getString("institucion"));
        oConsultaCita.setNombres(rs.getString("nombres"));
        oConsultaCita.setTipo(rs.getString("tipo"));
        return oConsultaCita;
    }

    private ConsultaCita crearObjetoPruebasFisicas(ResultSet rs) throws SQLException {
        ConsultaCita oConsultaCita = new ConsultaCita();
/*        
        oConsultaCita.setIdUsuario(rs.getString("id_usuario"));
        oConsultaCita.setApellido(rs.getString("apellido"));
        oConsultaCita.setEvaluacion(rs.getString("evaluacion"));
        oConsultaCita.setFecha(rs.getDate("fecha_nacimiento"));
        oConsultaCita.setInstitucion(rs.getString("institucion"));
        oConsultaCita.setNombres(rs.getString("nombres"));
        oConsultaCita.setTipo(rs.getString("tipo"));
  */
        oConsultaCita.setIdUsuario(rs.getString("idusuario"));
        oConsultaCita.setApellido(rs.getString("apellido"));
        oConsultaCita.setEvaluacion(rs.getString("evaluacion"));
        oConsultaCita.setFecha(rs.getDate("fecha_nacimiento"));
        oConsultaCita.setInstitucion(rs.getString("institucion"));
        oConsultaCita.setNombres(rs.getString("nombres"));
        oConsultaCita.setIdPull(rs.getString("idpull"));
        oConsultaCita.setIdEvaluacionPaciente(rs.getString("idevaluacionpaciente"));         
        return oConsultaCita;
    }

    public ArrayList findByPacientesResistencia(Connection conn, Date fecha, String turno, String pull, String especialista) throws InstanceNotFoundException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            int i = 0;
            ps = conn.prepareStatement(rb.getString("SQL_PACIENTES_RESISTENCIA"));
            ps.setDate(++i, fecha);
            ps.setString(++i, turno);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            ps.setDate(++i, fecha);
            ps.setString(++i, turno);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            ps.setDate(++i, fecha);
            ps.setString(++i, turno);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            ps.setDate(++i, fecha);
            ps.setString(++i, turno);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            rs = ps.executeQuery();
            ArrayList retorno = new ArrayList();
            while (rs.next()) {
                retorno.add(crearObjetoResistencia(rs));
            }
            return retorno;

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    private ConsultaCita crearObjetoResistencia(ResultSet rs) throws SQLException {
        ConsultaCita oConsultaCita = new ConsultaCita();
        oConsultaCita.setIdUsuario(rs.getString("idusuario"));
        oConsultaCita.setApellido(rs.getString("apellido"));
        oConsultaCita.setEvaluacion(rs.getString("evaluacion"));
        oConsultaCita.setFecha(rs.getDate("fecha_nacimiento"));
        oConsultaCita.setInstitucion(rs.getString("institucion"));
        oConsultaCita.setNombres(rs.getString("nombres"));
        oConsultaCita.setTipo(rs.getString("tipo"));
        oConsultaCita.setEjercicio(rs.getString("ejercicio"));
        oConsultaCita.setReloj(rs.getString("reloj"));
        return oConsultaCita;
    }

    public ArrayList findPacientesByApellidoId(Connection conn, String apellido, String id, Date fecha, String pull, String especialista) {
//        PreparedStatement ps = null;
//        ResultSet rs = null;
//        id = id.concat("%");
//        apellido = apellido.concat("%");
//        try {
//            int i = 0;
//
//
//            if (especialidad.equalsIgnoreCase("Fuerza")) {
//                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_CEDULA_DIA_FUERZA"));
//            } else if (especialidad.equalsIgnoreCase("Saltabilidad")) {
//                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_CEDULA_DIA_SALTABILIDAD"));
//            } else {
//                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_CEDULA_DIA_VELOCIDAD"));
//            }
//
//
//            ps.setString(++i, apellido);
//            ps.setString(++i, id);
//            ps.setDate(++i, fecha);
//            ps.setString(++i, pull);
//            ps.setString(++i, especialista);
//
//            ps.setString(++i, apellido);
//            ps.setString(++i, id);
//            ps.setDate(++i, fecha);
//            ps.setString(++i, pull);
//            ps.setString(++i, especialista);
//            rs = ps.executeQuery();
//            ArrayList retorno = new ArrayList();
//            while (rs.next()) {
//                retorno.add(crearObjeto(rs));
//            }
//            return retorno;
//
//        } catch (SQLException e) {
//            e.printStackTrace();
//
//        } finally {
//            try {
//                rs.close();
//                ps.close();
//            } catch (SQLException ex) {
//                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
//            }
//        }
        return null;
    }

    public ArrayList findPacientesByApellido(Connection conn, String apellido, Date fecha, String pull, String especialista, String especialidad) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        apellido = apellido.concat("%");
        try {
            int i = 0;


            if (especialidad.equalsIgnoreCase("Fuerza")) {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_DIA_FUERZA"));
            } else if (especialidad.equalsIgnoreCase("Saltabilidad")) {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_DIA_SALTABILIDAD"));
            } else {
                ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_APELLIDO_DIA_VELOCIDAD"));
            }

            ps.setString(++i, apellido);
            ps.setDate(++i, fecha);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);

            ps.setString(++i, apellido);
            ps.setDate(++i, fecha);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            rs = ps.executeQuery();
            ArrayList retorno = new ArrayList();
            while (rs.next()) {
                retorno.add(crearObjeto(rs));
            }
            return retorno;

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }

    public ArrayList findPacientesById(Connection conn, String id, Date fecha, String pull, String especialista) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        id = id.concat("%");
        try {
            int i = 0;
            ps = conn.prepareStatement(rb.getString("SQL_FIND_BY_CEDULA_DIA"));

            ps.setString(++i, id);
            ps.setDate(++i, fecha);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);

            ps.setString(++i, id);
            ps.setDate(++i, fecha);
            ps.setString(++i, pull);
            ps.setString(++i, especialista);
            rs = ps.executeQuery();
            ArrayList retorno = new ArrayList();
            while (rs.next()) {
                retorno.add(crearObjeto(rs));
            }
            return retorno;

        } catch (SQLException e) {
            e.printStackTrace();

        } finally {
            try {
                rs.close();
                ps.close();
            } catch (SQLException ex) {
                Logger.getLogger(DaoCita.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return null;
    }
}
